#ifndef __COMMON_H__
#define __COMMON_H__

#include <syslog.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>  
#include <sys/socket.h> 
#include <unistd.h>
#include <arpa/inet.h> 
#include <time.h>
#include <stdarg.h>
#include <pthread.h>

#include <string>
#include <fstream>
#include <map>

/*
#undef LOG
#define LOG(_fmt, ...) {                      \
	 printf(_fmt "\n", ## __VA_ARGS__); } 
*/

#define LOG(_fmt, ...) {                       \
	logger::get_instance()->log("INFO %s:%d " _fmt "\n",      \
          __FILE__, __LINE__, ## __VA_ARGS__); 			\
	printf(_fmt "\n", ## __VA_ARGS__); } 


using namespace std;

class logger
{
protected:
	logger();
public:
	~logger();
	static logger* get_instance();
	int set_log_file(const string file);
    void log(const char * format, ...);
	void direct_log(const char* str);
	static int ex_log_callback(const char* str);
private:
	pthread_mutex_t mu_;
	ofstream file_;
	char hostname_[64];
	static logger* instance_;
	
};

#undef GET_STRING
#define GET_STRING(str)                     \
	 configure::get_instance()->get_string(str)
	 
#undef GET_INT
#define GET_INT(str)                     \
	 configure::get_instance()->get_int(str)

class configure
{
protected:
	configure(){};
public:
	static configure* get_instance();
	int get_config(const string& path);
	
	int get_int(const string& key);
	string get_string(const string& key);
	int check_key(const string& key);
private:
  void parse_line(const std::string& line);
	map<string, string> kv_;
  static bool read_ukey_data(std::string* data);
	static configure* instance_;
};


#endif/*__COMMON_H__*/
